import unittest
import requests
from api.recharge_api import RechargeApi
from api.regloginapi import RegLoginApi
from api.openaccount_api import OpenAccountApi
from api.tender_api import TenderApi
from common.utils import common_assert
from common.html_uilt import html_util
from common.db_utils import init_tender_info, clear_user_info


class TestTenderProcess(unittest.TestCase):
    # 将使用的数据，设置为变量，方便进行统一管理
    r = 512345845554
    phone = "15877767775"
    Code = "8888"
    type = "type"
    password = "l123456"
    phone_code = "666666"
    dy_server = "on"
    invite_phone = None
    realname = "楚枫"
    card_id = "450102199003078798"
    amount = 500000
    amount_tz = 1000
    exp_status_code = 200
    exp_status = 200
    exp_description = "form"
    exp_description_2 = "成功"

    @classmethod
    def setUpClass(cls) -> None:
        # 调用封装清晰用户信息的方法
        clear_user_info()
        # 借款标测试数据初始化
        init_tender_info()

    def setUp(self) -> None:
        self.session = requests.session()
        # 实例化登录注册模块封装的类
        self.reg_login_api = RegLoginApi(self.session)
        # 实例化实名认证模块封装的类
        self.open_account_api = OpenAccountApi(self.session)
        # 实例化充值模块封装的类
        self.rechargeapi = RechargeApi(self.session)
        # 调用投资模块类
        self.tender_api = TenderApi(self.session)

    def tearDown(self) -> None:
        self.session.close()

    # 投资业务流程
    def test03_tender_process(self):
        # 1.图片验证码接口
        # 通过调用封装的图片验证码接口的方法，获取响应结果
        response_t = self.reg_login_api.get_img_verify_code(self.r)
        # 断言状态码
        self.assertEqual(self.exp_status_code, response_t.status_code)

        # 2.获取短信验证码接口
        # 通过调用封装的短信验证码接口的方法，获取响应结果
        response_pv = self.reg_login_api.get_phone_verify_code(self.phone, self.Code, self.type)
        # 断言-通用断言
        common_assert(self, response_pv, self.exp_status_code, self.exp_status, self.exp_description_2)

        # 3.注册接口
        # 通过调用封装的注册接口的方法，获取响应结果
        response_zc = self.reg_login_api.user_register(self.phone, self.password, self.Code, self.phone_code,
                                                       self.dy_server, self.invite_phone)
        # 断言-通用断言
        common_assert(self, response_zc, self.exp_status_code, self.exp_status, self.exp_description_2)

        # 4.登录接口
        # 通过调用封装的登录接口的方法，获取响应结果
        response_lo = self.reg_login_api.user_login(self.phone, self.password)
        # 断言-通用断言
        common_assert(self, response_lo, self.exp_status_code, self.exp_status, self.exp_description_2)

        # 5.实名认证接口
        # 通过调用封装的实名认证接口的方法，获取响应结果
        body = {'realname': self.realname, 'card_id ': self.card_id}
        response_sm = self.open_account_api.realname(body)
        json_data = response_sm.json()
        # 断言-通用断言
        common_assert(self, response_sm, self.exp_status_code, self.exp_status, self.exp_description_2)
        # 实名认证信息断言
        self.assertEqual("楚**", json_data['data']['realname'])
        self.assertEqual("450****798", json_data['data']['card_id'])

        # 6.开户接口
        # 通过调用封装的开户接口的方法，获取响应结果
        response_kh = self.open_account_api.open_account()
        # 断言-通用断言
        common_assert(self, response_kh, self.exp_status_code, self.exp_status, self.exp_description)

        # 7.第三方开户接口
        # 通过调用封装的获取第三方接口请求数据的方法，获取第三方开户接口的url和请求体数据
        url = html_util(response_kh)[0]
        form_data = html_util(response_kh)[1]
        # 通过调用封装的第三方开户接口的方法，传入url和请求体数据，获取响应结果
        response_third = self.open_account_api.third_open_account(url, form_data)
        # 断言状态码
        self.assertEqual(self.exp_status_code, response_third.status_code)
        # 断言响应体数据
        self.assertIn('OK', response_third.text)

        # 8.获取充值验证码接口
        # 通过调用封装的获取充值验证码接口的方法，获取响应结果
        response_cy = self.rechargeapi.get_recharge_verify_code(self.r)
        # 断言状态码
        self.assertEqual(self.exp_status_code, response_t.status_code)

        # 9.充值接口
        # 通过调用封装的充值接口的方法，获取响应结果
        response_cz = self.rechargeapi.recharge(self.amount, self.Code)
        # 断言-通用断言
        common_assert(self, response_cz, self.exp_status_code, self.exp_status, self.exp_description)

        # 10.第三方充值接口
        # 通过调用封装的获取第三方接口请求数据的方法，获取第三方开户接口的url和请求体数据
        url = html_util(response_cz)[0]
        form_data = html_util(response_cz)[1]
        # 通过调用封装的第三方充值接口的方法，传入url和请求体数据，获取响应结果
        response_3 = self.rechargeapi.third_recharge(url, form_data)
        # 断言状态码
        self.assertEqual(self.exp_status_code, response_3.status_code)
        # 断言响应体数据
        self.assertIn('OK', response_3.text)

        # 11.投资接口
        # 通过调用封装的投资接口的方法，获取响应结果
        response_tz = self.tender_api.tender(self.amount_tz)
        # 断言-通用断言
        common_assert(self, response_tz, self.exp_status_code, self.exp_status, self.exp_description)

        # 12.第三方投资接口
        # 通过调用封装的获取第三方接口请求数据的方法，获取第三方开户接口的url和请求体数据
        url = html_util(response_tz)[0]
        form_data = html_util(response_tz)[1]
        # 通过调用封装的第三方投资接口的方法，传入url和请求体数据，获取响应结果
        response_3_t = self.tender_api.third_tender(url, form_data)
        # 断言状态码
        self.assertEqual(self.exp_status_code, response_3_t.status_code)
        # 断言响应体数据
        self.assertIn('OK', response_3_t.text)
